//test2aaaaa111111
//  Data_Model.h
//  MacStockAppafffff
//
//  Created by 英傑 翁 on 12/2/13.
//  Copyright (c) 2012年 翁英傑. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "FMDatabase.h"

#import "Data_Object.h"
#import "DBHelper.h"
#import "NSString+SBJSON.h"
#import "JSON.h"

#import "XML_Bloomberg_Search.h"
#import "XML_Bloomberg_Quote.h"
#import "XML_Bloomberg_History.h"

#import "Multi_Server_GY_Search.h"
#import "Multi_Server_GY_Quote.h"
#import "Multi_Server_GY_History.h"
#import "Multi_Server_Google_Quote.h"

#import "Yahoo_Search_WEB.h"
#import "Yahoo_Quote_WEB.h"
#import "Yahoo_Web_History.h"

#import "Yahoo_Search_Mobile.h"
#import "Yahoo_Quote_Mobile.h"
#import "Yahoo_Mobile_History.h"

#import "Google_Search.h"
#import "Google_Quote.h"
#import "Google_History.h"

#import "Convert_timeZoneName.h"

#import "RLTableColumnHeader.h"
#import "RLChartMenuItem.h"

#import "PXTableObject.h"


@class SourceListItem;

/*設計重點原理
 初始化過程 
 1.先透過sql資料庫 取出每個市場或國家個別產業的股票
 2.將此資料形成陣列結構
 3.樹狀結構(SourceListItem.h)則以此陣列結構當作資料源來建立
 4.在建立樹狀結構的迴路過程中順便建立模型的個別資料(Data_Object)
 
*/

extern NSString * const NOT_output_chart; //通知走勢圖
extern NSString * const NOT_quote_reload; //貼佈告欄說已經有一個執行報價下載執行緒結束
extern NSString * const NOT_quote_begin; //貼佈告欄說已經有一個執行報價下載執行緒開始

extern NSString * const NOT_his_reload_APP1_Start_WindowController;   //貼佈告欄說已經有一個下載歷史資料執行緒結束
extern NSString * const NOT_his_begin_APP1_Start_WindowController;                                //貼佈告欄說已經有一個下載歷史資料執行緒開始

extern NSString * const NOT_his_reload_XXsheet_sort;                  //貼佈告欄說已經有一個下載歷史資料執行緒結束
extern NSString * const NOT_quote_begin_XXsheet_sort; 

extern NSString * const NOT_his_reload_XXsheet_output;
extern NSString * const NOT_quote_begin_XXsheet_output;


//標記：壓縮資料 加入壓縮協定<NSCoding>
@interface Data_Model : NSObject<NSCoding> {
    
    
    NSString *target_ProductName;
    NSString *productName;
    //資料源
    NSString *datasource;
    
    //個別股票資料陣列
    NSMutableArray *data_object_arrary;
    
    //尚未進入下載歷史資料執行緒的代碼
    NSMutableArray *unstart_code_array_his_data;
    
    //以下變數是用來使用樹狀結構資料點
    SourceListItem  *Para_SLT_system;
    SourceListItem  *Para_SLT_watchlist;
    SourceListItem  *Para_SLT_watchlist_1;
    
    NSMutableArray  *Para_SLT_Paraent_Array;     
    
    //NSString *watchlist_filename;
        
    //下載報價專用的工作序
    NSOperationQueue *queue_quote;    
    
    //最佳化工作執行序
    NSOperationQueue *queue_optimize_para;
    
    
    //下載歷史資料專用的工作序
    NSOperationQueue *queue_his_data;     
    
    RLTableColumnHeader *table_column_object_array;
    RLChartMenuItem *RLChartMenuItem_object_array;    
    
    //歷史資料取出過程中必須要計算的方法
    NSMutableArray *have_to_calculate_history_serial_indicator_signal;
    
    //將某節點之下的所有節點 合集成一個陣列集合
    NSMutableArray *temp_all_sub_node;
    
    //要進行樹狀排序的相關資料
    NSMutableDictionary *tree_sort_data;
    
    //要進行輸出資料的相關資料
    NSMutableDictionary *tree_output_data_to_chart;
    NSMutableDictionary *tree_output_data_to_excel;
    
    //sqlite 檔案路徑與名稱
    NSString *databasePath_nsame;
    
    //目前的回補資料過程是在最佳化處理
    NSNumber *is_on_Optimize_DataModel;
    
    //目前的回補資料過程是在最佳化處理
    NSNumber *is_on_TreeSort_DataModel;
    
    //目前的回補資料過程是在輸出資料過程處理
    NSNumber *is_on_output_to_chart_DataModel;

    //目前的回補資料過程是在輸出資料過程處理
    NSNumber *is_on_output_to_excel_DataModel;
    
    
    SourceListItem  *Para_SLT_optimize;//最佳化節點
    NSString *optimize_method;//最佳化方法
    
    int quote_Queue_total_count;  // 報價執行緒 開始數量
    int hisdata_Queue_total_count;// 歷史資料執行緒 開始數量
    
    NSMutableArray *code_array_Yahoo_Google; //google與yahoo代碼對照
    
    NSMutableDictionary *calculate_property_all ;
}
@property (retain)   NSString *productName;
@property (retain)   NSMutableDictionary *calculate_property_all ;
@property (retain)   NSMutableArray *code_array_Yahoo_Google; //google與yahoo代碼對照
@property (retain)   NSString *optimize_method;
@property (retain)   SourceListItem  *Para_SLT_optimize;
@property (retain)   NSNumber *is_on_Optimize_DataModel;
@property (retain)   NSNumber *is_on_TreeSort_DataModel;
@property (retain)   NSNumber *is_on_output_to_chart_DataModel;
@property (retain)   NSNumber *is_on_output_to_excel_DataModel;
@property (retain)   NSString *databasePath_nsame;
@property (retain)   NSMutableDictionary *tree_output_data_to_chart;
@property (retain)   NSMutableDictionary *tree_output_data_to_excel;
@property (retain)   NSMutableDictionary *tree_sort_data;
@property (retain)   NSMutableArray *temp_all_sub_node;
@property (retain)   NSMutableArray *have_to_calculate_history_serial_indicator_signal;
@property (retain)   NSString *datasource;
@property (retain)   NSMutableArray *unstart_code_array_his_data;
@property (retain)   SourceListItem  *Para_SLT_system;
@property (retain)   SourceListItem  *Para_SLT_watchlist;
@property (retain)   SourceListItem  *Para_SLT_watchlist_1;
@property (retain)   NSMutableArray  *Para_SLT_Paraent_Array;
@property (retain)   NSMutableArray  *data_object_arrary;
//@property (retain)   NSString *watchlist_filename;
@property (retain)   RLTableColumnHeader *table_column_object_array;
@property (retain)   RLChartMenuItem *RLChartMenuItem_object_array;
@property (retain)   NSOperationQueue *queue_quote;
//====初始設定與消滅============================
-(id)init_data:(NSString *)ds system_exchange:(NSArray *) system_country_array;

+(void)init_datasource; //初始設定資料源
+(void)init_path;       //初始目錄
+(void)init_property;       //初始屬性資料

//====資料節點的增加與搜尋=======================
-(Data_Object *)add_data_object_dic_data:(NSMutableDictionary *)dic_data;
-(Data_Object *)object_data_arrary_object_from_code_datamodel:(NSString *)code;
-(NSUInteger)index_data_arrary_object_from_code_datamodel:(NSString *)code;
-(void)list_data_structure;
  

//====產生陣列結構plist array 資料模式===========
//2.輸入多個國家代碼 並且將資料存到catches 目錄上 且傳回國家們節點
-(NSArray *)create_write_countrys_node:(NSArray *)countrys;
//1.製作國家節點
-(NSMutableDictionary *)create_country_node:(NSString *)country;
//0.輸入國家代碼 從sqlite取出股票資料 並且將這些資料轉成產業節點
-(NSMutableArray *)sqlite_data_to_node:(NSString *)country;

/*取的分類名稱結構 
 輸入:交易所或國家代碼
 得到:陣列資料 -> 元素(字典資料)
 字典資料 
 key:
 1.identifier
 2.title
 3.icon
 4.badgeValue
 5.children
 6.isUseForGroup
 7.tablecode_array->元素(字典資料) key:DB_code,DB_symbol,DB_country ,DB_class, DB_name_english,DB_name_chinese 
 */

//


 

//========代碼名稱搜尋==========
//輸入要搜尋的字串：serach_strings
//回傳值：陣列 每個陣列為Dictionary 分別儲存代碼 名稱
 -(NSArray *)serach_data:(NSString *)datasourcea searching:(NSString *)serach_strings;
//============================

//此資料庫有哪些報價欄位
+(NSMutableArray*)Table_columns_array:(NSString *)datasourcea;
//資料庫有哪些歷史資料計算方法
+(NSMutableArray*)RLChartMenuItem_array:(NSString *)datasourcea;

//========報價資料=============
//輸入代碼陣列
//將報價取得資料存入到個別資料陣列裡資料：Data_Object.
-(void)Quote_Start:(NSArray *)code_array;
-(void)Quote_Finished:(NSArray *)document; 

//============================

//========歷史資料=============
-(void)His_Data_Start:(NSString *)code;
-(void)His_Data_Finished:(NSMutableDictionary *)document; 
//沒有真正的回補
-(void)His_Data_Finished_not_reload:(NSMutableDictionary *)document;

//-(void)refresh_quote_last_his_data_update:(Data_Object *)obj hisdtat_serial:(NSMutableArray *)hisdtat_serial ;

//輸入代碼取出時區名稱
-(NSString *)symbol_convert_timeZone:(NSString *)symbol;

-(void)table_column_caluate_all:(PXTableObject *)tablee;
//將陣列資料轉成要呈現的樹狀資料
-(SourceListItem *)array_convert_to_tree:(NSArray * )importarrar paraobject:(SourceListItem *)paob;
//將要呈現的樹狀資料轉成陣列資料
-(NSMutableArray *)tree_convert_to_array:(NSArray *)treearray;
//將變更後的樹狀資料轉成陣列 再存檔
-(void)array_save_to_watchlist_plist:(SourceListItem*)tree write_path_filename:(NSString *)_w_path_name;
//將所有的樹狀資料一次儲存
-(void)save_all_tree_data:(SourceListItem *)_target_sourlist;
 
//統計樹狀資料的資料夾合計數目
-(void)tree_folder_to_sum_array:(NSMutableArray *)childarray;
-(void)tree_folder_to_sum:(SourceListItem *)si;
-(void)update_all_tree_folder_to_sum;

//樹狀資料裡面的資料夾的tableobject重新整理
//輸入孫或子任一層的節點之後 反推到最頂層的節點,從該最上層的節點往下更新節點資料結構
-(void)tree_form_top_to_sub_node:(SourceListItem *)any_para_SLI;
-(void)tree_folder_tableobject_single_sourlist:(SourceListItem *)para_SLI;
-(void)tree_folder_tableobject_single_array:(NSMutableArray *)childarray;
-(void)tree_folder_tableobject_refresh:(SourceListItem *)si;
-(void)update_all_tree_folder_tableobject_refresh:(NSUInteger )inx;

//歷史記憶體消除
-(void)reset_history_memory;
//重新計算所有指標與訊號
-(void)re_calculate_all_history_object_indicator_signal;

//將NSdate 轉成 yyyyMMdd
-(int)nsdate_convert_to_yyyymmdd:(NSDate *)dates timezone:(NSString *)ts; 

//整合報價表與走勢圖上的計算方法
-(void)combine_calculate_method_table_chart;

//在選定的節點上拷貝資料夾
-(SourceListItem *)copyFolder_on_select_tree_node:(SourceListItem *)select_node;
//在選定的節點上增加資料夾
-(SourceListItem *)addFolder_on_select_tree_node:(SourceListItem *)select_node;
//在選定的節點的下一個階層增加資料夾
-(SourceListItem *)addFolder_on_select_tree_node_sub:(SourceListItem *)select_node;
//在選定的節點上增加自選股組合
-(SourceListItem *)addwatchlist_on_select_tree_node:(SourceListItem *)select_node;
//在選定的節點下一個階層增加自選股組合
-(SourceListItem *)addwatchlist_on_select_tree_node_sub:(SourceListItem *)select_node;

//更名
-(void)Rename_SourceListItem:(SourceListItem *)selectnode newName:(NSString *)newname;
//刪除單一
-(void)delete_singal_SourceListItem:(SourceListItem *)selectnode;
 

//將某節點之下的所有節點 合集成一個陣列集合 含自己
-(void)node_sub_tree__to_array_loop:(NSMutableArray *)childarray;
-(void)node_sub_tree__to_array:(SourceListItem *)si;

// 歷史資料執行緒 開始數量
-(void)set_hisdata_Queue_total_count;


@end
